package com.example.springboot_jdk8.entity;


import cn.hutool.crypto.digest.MD5;
import com.example.springboot_jdk8.config.Md5ExcludeField;
import lombok.Data;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;

@Data
public class MdmOrg {

    /**
     * 主键id
     */
    @Md5ExcludeField
    private Long id;

    /**
     * 组织ID路径/1/2
     */
    @Md5ExcludeField
    private String orgPath;

    @Md5ExcludeField
    private Integer level;

    /**
     * 主数据申请编码文本 仅做记录
     */
    private String applyCode;

    /**
     * 编码文本 示例：1216
     */
    private String orgNo;

    /**
     * 名称文本 示例：名称
     */
    private String orgName;

    /**
     * 简称文本 示例：简称
     */
    private String orgShortName;

    /**
     * 主键文本 示例：主键
     */
    private String orgPrimaryKey;

    /**
     * 父级唯一标识文本 示例：00200001
     */
    private String orgParentCode;

    /**
     * 组织机构唯一标识文本 示例：001000001216
     */
    private String orgUniCode;

    /**
     * 主数据状态编码，例：00:可用 1:停用（这个主要标识数据是否可用）
     */
    private String masterStatus;

    /**
     * 上级编码文本 示例：000
     */
    private String fatherOrg;

    /**
     * 上级节点（树节点）文本 示例: 党组领导
     */
    private String parentOrgCode;

    /**
     * 国家编码_名称: 示例：CN_中国
     */
    private String orgCountry;

    /**
     * 省/直辖市文本 示例: 省/直辖市
     */
    private String orgProvince;

    /**
     * 城市文本 示例: 城市
     */
    private String orgCity;

    /**
     * 通讯地址文本 示例: 通讯地址
     */
    private String orgAddress;

    /**
     * 是否是公司文本 示例: 是/否
     */
    private String isCompany;

    /**
     * 部门类型文本 示例: 部门类型
     */
    private String deptType;

    /**
     * 所属集团文本 示例：国家管网集团
     */
    private String orgCompany;

    /**
     * 所属组织文本 示例：党组领导
     */
    private String org;

    /**
     * 部门排序号文本 示例：090
     */
    private String orgShowNum;

    /**
     * 组织机构类型文本 编码_名称 示例：02_内设机构
     */
    private String orgTypeCode;

    /**
     * 组织机构名称文本 示例：组织机构名称
     */
    private String orgUniName;

    /**
     * 组织机构排序号文本 示例：9999
     */
    private String orgParentShowNum;

    /**
     * MDM创建人文本 示例：indata（员工账号）
     */
    private String createUser;

    /**
     * MDM创建时间 2023-01-01 12:00:00
     */
    private String createTime;

    /**
     * MDM修改人文本 示例：indata（员工账号）
     */
    private String updateUser;

    /**
     * MDM修改时间 2023-01-01 12:00:00
     */
    private String updateTime;


    protected String md5Sum(){
        Field[] declaredFields = this.getClass().getDeclaredFields();
        String fieldValues = Arrays.stream(declaredFields).filter(field -> {
                    Md5ExcludeField annotation = field.getAnnotation(Md5ExcludeField.class);
                    return annotation != null && !annotation.exclude();
                }).map(field -> {
                    field.setAccessible(true);
                    try {
                        Object value = field.get(this);
                        return value.toString();
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    }
                }).filter(Objects::nonNull)
                .collect(Collectors.joining(","));
        return MD5.create().digestHex(fieldValues);
    }

    public Boolean compareMd5(MdmOrg mdmOrg){
        return this.md5Sum().equals(mdmOrg.md5Sum());
    }

    public static void main(String[] args) {
        MdmOrg mdmOrg = new MdmOrg();
        mdmOrg.setOrg("fsfs");
        mdmOrg.setFatherOrg("fsafsd");
        mdmOrg.setDeptType("fdsf");
        Field[] declaredFields = mdmOrg.getClass().getDeclaredFields();
        Arrays.stream(declaredFields).forEach(field -> {
            Md5ExcludeField annotation = field.getAnnotation(Md5ExcludeField.class);
            System.out.println(annotation);
            System.out.println(annotation != null?annotation.exclude():"空的");

        });

    }
}
